package com.answeringplayer.mapper;

import com.answeringplayer.dto.PracticeRecordDTO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 练习记录Mapper接口
 */
@Mapper
public interface PracticeRecordMapper {

    /**
     * 插入练习记录
     */
    int insert(PracticeRecordDTO practiceRecord);

    /**
     * 根据ID查询练习记录
     */
    PracticeRecordDTO selectById(@Param("recordId") Long recordId);

    /**
     * 根据用户ID查询练习记录
     */
    List<PracticeRecordDTO> selectByUserId(@Param("userId") Long userId);

    /**
     * 根据用户ID和练习类型查询练习记录
     */
    List<PracticeRecordDTO> selectByUserIdAndType(@Param("userId") Long userId,
                                                  @Param("practiceType") String practiceType);

    /**
     * 更新练习记录
     */
    int update(PracticeRecordDTO practiceRecord);

    /**
     * 根据ID删除练习记录
     */
    int deleteById(@Param("recordId") Long recordId);

    /**
     * 查询用户的练习记录（分页）
     */
    List<PracticeRecordDTO> selectByUserIdWithPagination(@Param("userId") Long userId,
                                                         @Param("offset") int offset,
                                                         @Param("limit") int limit);

    /**
     * 统计用户的练习记录数量
     */
    int countByUserId(@Param("userId") Long userId);

    /**
     * 根据时间范围查询练习记录
     */
    List<PracticeRecordDTO> selectByTimeRange(@Param("userId") Long userId,
                                              @Param("startTime") LocalDateTime startTime,
                                              @Param("endTime") LocalDateTime endTime);

    /**
     * 查询用户的最近练习记录
     */
    List<PracticeRecordDTO> selectRecentByUserId(@Param("userId") Long userId,
                                                 @Param("limit") int limit);

    /**
     * 根据题库ID查询练习记录
     */
    List<PracticeRecordDTO> selectByBankId(@Param("bankId") Integer bankId);

    /**
     * 批量插入练习记录
     */
    int batchInsert(@Param("records") List<PracticeRecordDTO> records);

    /**
     * 更新练习记录的结束时间和分数
     */
    int updateEndTimeAndScore(@Param("recordId") Long recordId,
                              @Param("endTime") LocalDateTime endTime,
                              @Param("score") Integer score,
                              @Param("correctCount") Integer correctCount);
}